home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import pygtk
- pygtk.require('2.0')
- import gtk
- import gtk.gdk as gdk
- import dbus
- import dbus.service as dbus
- import dbus.mainloop.glib as dbus
- import time
- import threading
- import os.path as path
- import os
- import sys
- import optparse
- import subprocess as sb
- opt = optparse.OptionParser()
- opt.add_option('--daemon', '-d', action = 'store_true', dest = 'daemon', default = False, help = 'Run as daemon, default: %default')
- (options, args) = opt.parse_args()
-
- def daemonize(stdout = '/dev/null', stderr = None, stdin = '/dev/null', pidfile = None):
- '''
- This forks the current process into a daemon.
- The stdin, stdout, and stderr arguments are file names that
- will be opened and be used to replace the standard file descriptors
- in sys.stdin, sys.stdout, and sys.stderr.
- These arguments are optional and default to /dev/null.
- Note that stderr is opened unbuffered, so
- if it shares a file with stdout then interleaved output
- may not appear in the order that you expect.
- '''
-
- try:
- pid = os.fork()
- if pid > 0:
- sys.exit(0)
- except OSError:
- e = None
- sys.stderr.write('fork #1 failed: (%d) %s\n' % (e.errno, e.strerror))
- sys.exit(1)
-
- os.chdir('/')
- os.umask(0)
- os.setsid()
-
- try:
- pid = os.fork()
- if pid > 0:
- sys.exit(0)
- except OSError:
- e = None
- print 'second fork error'
- sys.stderr.write('fork #2 failed: (%d) %s\n' % (e.errno, e.strerror))
- sys.exit(1)
-
- if not stderr:
- stderr = stdout
-
- si = file(stdin, 'r')
- so = file(stdout, 'w+')
- se = file(stderr, 'a+', 0)
- pid = str(os.getpid())
- print 'Start SpeedMeter with Pid: %s\n' % pid
- sys.stderr.flush()
- if pidfile:
- file(pidfile, 'w+').write('%s\n' % pid)
-
- sys.stdout.flush()
- sys.stderr.flush()
- os.dup2(si.fileno(), sys.stdin.fileno())
- os.dup2(so.fileno(), sys.stdout.fileno())
- os.dup2(se.fileno(), sys.stderr.fileno())
-
-
- class Timer(threading.Thread):
- '''add 0 to clist every second, clist must be a list of int'''
-
- def __init__(self, accumulate):
- super(Timer, self).__init__()
- self.on = True
- self.tlock = threading.RLock()
- self.func = accumulate
- self.sum = 0
-
-
- def run(self):
- while self.on:
- if self.sum == 0:
- self.func(0)
-
- self.sum = (self.sum + 1) % 5
- time.sleep(0.2)
-
-
- def join(self):
- self.on = False
- super(Timer, self).join()
-
-
-
- class Handle(gtk.EventBox):
-
- def __init__(self):
- super(Handle, self).__init__()
- self.set_events(gdk.BUTTON_PRESS_MASK | gdk.BUTTON_RELEASE_MASK | gdk.BUTTON1_MOTION_MASK)
- self.connect('button_press_event', self.do_button_press_event)
- self.connect('button_release_event', self.do_button_release_event)
- self.connect('motion_notify_event', self.do_motion_notify_event)
- self._Handle__move_begined = False
-
-
- def do_button_press_event(self, widget, event, data = None):
- if event.button == 1:
- root = gdk.get_default_root_window()
-
- try:
- desktop = root.property_get('_NET_CURRENT_DESKTOP')[2][0]
- self._Handle__workarea = root.property_get('_NET_WORKAREA')[2][desktop * 4:(desktop + 1) * 4]
- except:
- self._Handle__workarea = None
-
- self._Handle__move_begined = True
- toplevel = self.get_toplevel()
- (x, y) = toplevel.get_position()
- self._Handle__press_pos = (event.x_root - x, event.y_root - y)
- self.window.set_cursor(gdk.Cursor(gdk.FLEUR))
- return True
- return False
-
-
- def do_button_release_event(self, widget, event, data = None):
- if event.button == 1:
- self._Handle__move_begined = False
- del self._Handle__press_pos
- del self._Handle__workarea
- self.window.set_cursor(gdk.Cursor(gdk.HAND1))
- return True
- return False
-
-
- def do_motion_notify_event(self, widget, event, data = None):
- if not self._Handle__move_begined:
- return None
- toplevel = self.get_toplevel()
- (x, y) = toplevel.get_position()
- x = int(event.x_root - self._Handle__press_pos[0])
- y = int(event.y_root - self._Handle__press_pos[1])
- if self._Handle__workarea == None:
- toplevel.move(x, y)
- return None
- if y < self._Handle__workarea[1] and y > self._Handle__workarea[1] - 16:
- y = self._Handle__workarea[1]
-
- (w, h) = toplevel.get_size()
- if x + w > self._Handle__workarea[0] + self._Handle__workarea[2] and x + w < self._Handle__workarea[0] + self._Handle__workarea[2] + 16:
- x = self._Handle__workarea[0] + self._Handle__workarea[2] - w
-
- if y + h > self._Handle__workarea[1] + self._Handle__workarea[3] and y + h < self._Handle__workarea[1] + self._Handle__workarea[3] + 16:
- y = self._Handle__workarea[1] + self._Handle__workarea[3] - h
-
- toplevel.move(x, y)
-
-
- SPEED_METER_PATH = '/org/ibus/table/SpeedMeter'
-
- class SpeedMeter(dbus.service.Object):
- '''Show the typing speed of user'''
-
- method = lambda **args: dbus.service.method(dbus_interface = 'org.ibus.table.SpeedMeter', **args)
-
- signal = lambda **args: dbus.service.signal(dbus_interface = 'org.ibus.table.SpeedMeter', **args)
-
- def __init__(self, conn):
- self._SpeedMeter__conn = conn
- self._SpeedMeter__path = SPEED_METER_PATH
- super(SpeedMeter, self).__init__(self._SpeedMeter__conn, self._SpeedMeter__path)
- self.list = [
- (0, time.time(), 0)]
- self.create_ui()
- self.full = False
- self.c_time = 0
- self.timer = Timer(self.update_speed)
- gdk.threads_enter()
- self.timer.start()
- gdk.threads_leave()
- self.run()
-
-
- def Accumulate(self, phrase_len):
- self.update_speed(phrase_len)
-
- Accumulate = method(in_signature = 'i')(Accumulate)
-
- def Reset(self):
- self.reset()
-
- Reset = method()(Reset)
-
- def Quit(self):
- self.quit()
-
- Quit = method()(Quit)
-
- def Show(self):
- self.window.move(*self.pos)
- self.window.show()
-
- Show = method()(Show)
-
- def Hide(self):
- self.pos = self.window.get_position()
- self.window.hide()
-
- Hide = method()(Hide)
-
- def quit(self):
- gtk.main_quit()
- gdk.threads_leave()
- self.timer.join()
-
-
- def quit_from_timer(self):
- gtk.main_quit()
- gdk.threads_leave()
-
-
- def create_ui(self):
- self.window = gtk.Window(gtk.WINDOW_POPUP)
- root = gdk.get_default_root_window()
-
- try:
- workarea = root.property_get('_NET_WORKAREA')[2]
- right = workarea[2]
- bottom = workarea[3]
- except:
- (right, bottom) = root.get_size()
-
- self.pos = (right - 100, bottom - 90)
- self.window.move(*self.pos)
- self.event_box = Handle()
- self.event_box.connect('button_press_event', self.do_button_press_event)
- self.event_box.show()
- self.window.add(self.event_box)
- self.event_box.realize()
- self.event_box.window.set_cursor(gdk.Cursor(gdk.HAND1))
- self.frame = gtk.Frame()
- self.frame.show()
- self.event_box.add(self.frame)
- self.vbox = gtk.VBox()
- self.vbox.show()
- self.frame.add(self.vbox)
- self.frame1 = gtk.Frame()
- self.frame1.show()
- self.vbox.pack_start(self.frame1)
- self.label_color = gdk.Color(0, 0, 65535)
- self.speed_label = gtk.Label()
- self.speed_label.set_text('0')
- self.speed_label.set_size_request(81, 47)
- self.speed_label.set_justify(gtk.JUSTIFY_CENTER)
- self.speed_label.modify_fg(gtk.STATE_NORMAL, self.label_color)
- self.speed_label.show()
- self.vbox.pack_start(self.speed_label)
-
-
- def run(self):
- gdk.threads_enter()
- gtk.main()
-
-
- def update_speed(self, phrase_len):
- '''Update the output of SpeedMeter'''
- now = time.time()
- self.timer.tlock.acquire()
- self.list.append((phrase_len, now))
- self.list = (map,)((lambda x: (x[0], x[1], now - x[1])), self.list)
- self.list = filter((lambda x: x[2] < 61), self.list)
- self.timer.tlock.release()
- if not self.full:
- self.c_time = self.list[-1][1] - self.list[0][1]
- if not self.c_time > 1 or self.c_time:
- pass
- self.c_time = 1
- self.full = self.c_time >= 60
-
- speed = sum(map((lambda x: x[0]), self.list)) * 60 / self.c_time
- speed = int(speed)
- if speed > 10:
- if speed < 112:
- if speed >= 61:
- color = (112 - speed) * 5
- self.label_color.red = 65535
- self.label_color.blue = (color << 8) + color
- else:
- color = (speed - 10) * 5
- self.label_color.red = (color << 8) + color
- self.label_color.blue = 65535
- else:
- self.label_color.red = 65535
- self.label_color.blue = 0
- else:
- self.label_color.red = 0
- self.label_color.blue = 65535
- self.speed_label.set_text('%d' % speed)
- self.speed_label.modify_fg(gtk.STATE_NORMAL, self.label_color)
-
-
- def reset(self):
- self.timer.tlock.acquire()
- self.list = [
- (0, time.time(), 0)]
- self.full = False
- self.c_time = 0
- self.timer.tlock.release()
- self.update_speed(0)
-
-
- def do_button_press_event(self, widget, event, data = None):
- if event.button == 3:
- self.reset()
- return True
- return False
-
-
- if __name__ == '__main__':
- dbus.mainloop.glib.DBusGMainLoop(set_as_default = True)
- bus = dbus.Bus()
- user = path.basename(path.expanduser('~'))
- name = 'org.ibus.table.SpeedMeter.%s' % user
- request = bus.request_name(name, dbus.bus.NAME_FLAG_DO_NOT_QUEUE)
- if request != dbus.bus.REQUEST_NAME_REPLY_PRIMARY_OWNER:
- sys.exit()
-
- if options.daemon:
- daemonize('/dev/null', None, '/dev/null')
-
- busname = dbus.service.BusName(name, bus)
- gdk.threads_init()
- SpeedMeter(bus)
-
-